package com.hd123.rumba.gwt.entrypoint2.client;

import java.util.HashMap;
import java.util.List;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.Window;
import com.hd123.rumba.gwt.base.client.RBAsyncCallback2;
import com.hd123.rumba.gwt.base.client.RBRemoteServiceAsync;
import com.hd123.rumba.gwt.base.client.Session;
import com.hd123.rumba.gwt.base.client.biz.BSimpleBasic;
import com.hd123.rumba.gwt.base.client.exception.ClientBizException;
import com.hd123.rumba.gwt.widget2.client.dialog.RLoadingDialog;

/**
 * 基于Widget2模块使用的入口点基类，用来代替
 * {@link com.hd123.rumba.gwt.base.client.EntryPointBase}
 * 
 * @author LiQi
 * 
 */
public abstract class EntryPointBase2 implements EntryPoint {

  public void onModuleLoad() {
    if (getRemoteService() == null)
      return;

    RLoadingDialog.show();
    getRemoteService().getCurrentSession(buildParams(), new RBAsyncCallback2() {
      public void onException(Throwable caught) {
        RLoadingDialog.hide();
        Window.alert(caught.getMessage());
      }

      public void onSuccess(Object result) {
        RLoadingDialog.hide();
        session = (Session) result;
        onSessionLoad();
      }

    });
  }

  /**
   * 构造模块入口参数，由继承类覆盖。
   * 
   * @return
   */
  protected HashMap buildParams() {
    // do nothing
    return null;
  }

  /**
   * 取得当前对应的远程服务。
   * 
   * @return
   */
  public abstract RBRemoteServiceAsync getRemoteService();

  /** 当前会话信息 */
  private Session session = null;

  /**
   * 当会话{@link #session}被载入的时候被调用。提供给子类重写该方法。
   * 
   */
  protected void onSessionLoad() {
    // Do Nothing
  };

  /**
   * 取得当前会话信息。
   * 
   * @return
   */
  public Session getCurrentSession() {
    return session;
  }

  /**
   * 取得当前登录用户。
   * 
   * @return
   * @throws ClientBizException
   */
  public BSimpleBasic getCurrentUser() {
    if (session == null)
      return null;
    return session.getUser();
  }

  /**
   * 取得当前登录域。
   * 
   * @return
   * @throws ClientBizException
   */
  public BSimpleBasic getCurrentDomain() {
    if (session == null)
      return null;
    return session.getDomain();
  }

  /**
   * 取得当前登录组织。
   * 
   * @return
   * @throws ClientBizException
   */
  public BSimpleBasic getCurrentOrganization() {
    if (session == null)
      return null;
    return session.getOrganization();
  }

  /**
   * 取得模块标题。
   * 
   * @return
   */
  public abstract String getModuleCaption();

  /**
   * 判断是否有权限。
   * 
   * @param permCode
   *            指定权限代码。
   * @return
   */
  public boolean hasPermission(String permCode) {
    return hasPermission(permCode, false);
  }

  /**
   * 判断是否有权限。
   * 
   * @param permCode
   *            指定权限代码。
   * @param hasNull
   *            指定是否拥有null权限，即当permCode为null的时候的返回值。
   * @return
   */
  public boolean hasPermission(String permCode, boolean hasNull) {
    if (session == null)
      return false;
    if (permCode == null)
      return hasNull;
    List permSet = (List) session.get(Session.KEY_PERMISSIONS);
    if (permSet == null)
      return hasNull;
    return permSet.contains(permCode);
  }

  /** URL参数列表 */
  private HashMap parameters = null;

  /**
   * 获得URL的参数部分，即问号后面的部分
   * 
   * @return
   */
  public native String getURLQuery()
  /*-{
    return $wnd.location.search.substr(1)
  }-*/;

  /**
   * 获取URL的#后面的部分。
   * 
   * @return
   */
  public native String getURLHash()
  /*-{
    return $wnd.location.hash.substr(1)
  }-*/;

  /**
   * 获得URL参数列表
   * 
   * @return
   */
  public HashMap getParameters() {
    if (parameters == null) {
      parameters = new HashMap();

      String query = getURLQuery();
      if (!"".equals(query)) {
        String[] queryElements = query.split("&");
        for (int i = 0; i < queryElements.length; i++) {
          String[] kv = queryElements[i].split("=");
          if (kv.length == 2)
            parameters.put(kv[0], kv[1]);
          else if (kv.length == 1)
            parameters.put(kv[0], "");
        }
      }

      // 在GWT 1.4中hash中的“&”是%26，“=”是%3D，在GWT 1.7中没有这个问题
      String hash = getURLHash();
      if (!"".equals(hash.trim())) {
        parameters.clear(); // hash覆盖query部分
        String splitBy = hash.contains("&") ? "&" : "%26";
        String[] hashElements = hash.split(splitBy);
        for (int i = 0; i < hashElements.length; i++) {
          splitBy = hashElements[i].contains("=") ? "=" : "%3D";
          String[] kv = hashElements[i].split(splitBy);
          parameters.put(kv[0], kv[1]);
        }
      }
    }

    return parameters;
  }

  /**
   * 查询URL参数列表
   * 
   * @param key
   * @return key对应的value
   */
  public String getParameterValue(String key) {
    String result = (String) getParameters().get(key);
    return result == null ? "" : result;
  }

  /**
   * URL中start参数的值
   * 
   * @return
   */
  public String getStartNode() {
    return getParameterValue("start");
  }

  /**
   * 显示无权限的页面。
   */
  public void showNoAccess() {
    Window.alert("您无权限查看该页面，请与系统管理员联系。");
  }

}
